package netzwerk;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.concurrent.locks.Lock;

import model.Order;
import fpt.com.Product;

public class WarehouseWorker extends Thread {

	private Socket s;
	private ObjectInputStream oin;
	private ObjectOutputStream oout;
	private Warehouse wh;
	Lock lock;

	public WarehouseWorker(Socket socket, Warehouse wh, Lock orderTotalLock) throws IOException {
		this.wh = wh;
		this.s = socket;
		this.lock = orderTotalLock;
		oout = new ObjectOutputStream(s.getOutputStream());
		oin = new ObjectInputStream(s.getInputStream());
	}

	public void receive() throws ClassNotFoundException, IOException {

		// Auslesen des Input-Streams		
		String name = oin.readObject().toString();
		String pw = oin.readObject().toString();

		Order order = (Order) oin.readObject();
		System.out.println("Neue Order erhalten");

		// Order wird bei erfolgreichem Login an Client zurückgesendet
		if (validateLogin(name, pw)) {
			System.out.println("Order wird bearbeitet.");
			write(order);
		} else {
			write(null);
		}

	}

	public void write(Order order) throws IOException {

		if (order == null) {
			oout.writeBoolean(false);
		} else {
			oout.writeBoolean(true);
			oout.writeObject(order);
			System.out.println("Bestellbestätigung verschickt.");

			lock.lock();
			for (fpt.com.Product p : order) {
				// Fügt Produkt zur Gesamt-Order hinzu
				// Falls Produkt mit gleichem Namen schon vorhanden ist, wird Quantity erhöht
				wh.getOrderTotal().addIncreaseQuantityIfProductAlrasyExists(p);
			}
			printOrders(order);
			lock.unlock();
		}
		oout.flush();
	}

	@Override
	public void run() {

		while (true) {
			try {
				receive();
			} catch (SocketException e) {
				System.out
						.println("Client nicht mehr verfügbar");
				break;
			} catch (ClassNotFoundException e) {
				System.out
						.println("Klasse des einzulesenden Objektes konnte nicht gefunden werden.");
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	// Prüfen der Login-Daten
	private boolean validateLogin(String name, String pw) {
		System.out.println("Validating login data...");
		if (name.equals("admin") && pw.equals("admin")) {
			System.out.println("Login accepted");
			return true;

		}
		System.out.println("Login rejected");
		return false;
	}
	
	// Gesamte Bestellungen ausgeben
	private void printOrders(Order o) {
		for (Product p : o) {
			System.out.println(p.getName() + ", Menge: " + p.getQuantity() + ", Preis: "
					+ p.getPrice() * p.getQuantity());
		}
		System.out.println("");
		System.out.println("Orders gesamt");
		System.out.println("=========================");

		for (Product p : wh.getOrderTotal()) {
			System.out.println(p.getName() + ", Menge: " + p.getQuantity() + ", Preis: "
					+ p.getPrice() * p.getQuantity());
		}

		System.out.println("=========================");
		int totalQuant = 0;
		double totalSum = 0;

		totalQuant += wh.getOrderTotal().getQuantity();
		totalSum += wh.getOrderTotal().getSum();
		System.out.println("Gesamtanzahl: " + totalQuant);
		System.out.println("Gesamtwert: " + totalSum);
		System.out.println("");
	}
}
